const express = require('express');
const multer = require('multer');
const path = require('path');
const fs = require('fs');
const bodyParser = require('body-parser'); // 新增

const app = express();
const port = 3000;

// 中间件
app.use(bodyParser.json()); // 新增：解析 JSON 请求体
app.use(bodyParser.urlencoded({ extended: true })); // 新增：解析表单数据
app.use(express.static('public'));

// 文件上传配置
const uploadDir = path.join(__dirname, 'uploads');
if (!fs.existsSync(uploadDir)) {
    fs.mkdirSync(uploadDir);
}

const storage = multer.diskStorage({
    destination: function (req, file, cb) {
        cb(null, uploadDir);
    },
    filename: function (req, file, cb) {
        cb(null, Date.now() + '-' + file.originalname);
    }
});

const upload = multer({ storage: storage });

// 留言数据存储
const messagesFile = path.join(__dirname, 'messages.json');
let messages = [];

// 加载现有留言
if (fs.existsSync(messagesFile)) {
    messages = JSON.parse(fs.readFileSync(messagesFile, 'utf-8'));
}

// 文件上传路由
app.post('/upload', upload.array('file'), (req, res) => {
    try {
        if (!req.files || req.files.length === 0) {
            return res.status(400).json({ error: '没有选择文件' });
        }
        
        const fileNames = req.files.map(file => file.originalname);
        res.json({ 
            message: `成功上传 ${req.files.length} 个文件: ${fileNames.join(', ')}`
        });
    } catch (err) {
        console.error(err);
        res.status(500).json({ error: '上传过程中出现错误' });
    }
});

// 留言板路由
app.post('/message', (req, res) => {
  console.log('收到留言请求:', req.body);
  try {
    const { content } = req.body;
    if (!content || content.trim() === '') {
      return res.status(400).json({ error: '留言内容不能为空' });
    }

    const newMessage = {
      id: Date.now(),
      author: req.ip,
      content: content.trim(),
      timestamp: new Date().toISOString()
    };

    messages.push(newMessage);
    saveMessages();

    console.log('留言发布成功:', newMessage);
    res.status(201).json(newMessage);
  } catch (err) {
    console.error('留言发布错误:', err);
    res.status(500).json({ error: '发布留言时出错' });
  }
});

// 获取留言路由,默认是升序
/* app.get('/messages', (req, res) => {
  res.json(messages);
}); */
// 获取留言路由 - 按时间降序排列
app.get('/messages', (req, res) => {
    try {
        // 按时间降序排列（最新在最前）
        const sortedMessages = [...messages].sort((a, b) => {
            return new Date(b.timestamp) - new Date(a.timestamp);
        });
        res.json(sortedMessages);
    } catch (err) {
        console.error(err);
        res.status(500).json({ error: '获取留言时出错' });
    }
});

function saveMessages() {
  fs.writeFileSync(messagesFile, JSON.stringify(messages, null, 2), 'utf-8');
  console.log('留言已保存到文件');
}

// 启动服务器
app.listen(port, () => {
  console.log(`服务器运行在 http://localhost:${port}`);
});

// 删除留言路由
app.delete('/message/:id', (req, res) => {
    try {
        const messageId = parseInt(req.params.id);
        const initialLength = messages.length;
        
        // 过滤掉要删除的留言
        messages = messages.filter(msg => msg.id !== messageId);
        
        if (messages.length === initialLength) {
            return res.status(404).json({ error: '留言不存在' });
        }
        
        saveMessages();
        res.json({ success: true, message: '留言已删除' });
    } catch (err) {
        console.error('删除留言错误:', err);
        res.status(500).json({ error: '删除留言时出错' });
    }
});

// 批量删除留言路由
app.delete('/messages/batch', (req, res) => {
    try {
        const { ids } = req.body;
        
        if (!ids || !Array.isArray(ids) || ids.length === 0) {
            return res.status(400).json({ error: '请提供有效的留言ID数组' });
        }
        
        const initialCount = messages.length;
        messages = messages.filter(msg => !ids.includes(msg.id));
        
        if (messages.length === initialCount) {
            return res.status(404).json({ error: '未找到匹配的留言' });
        }
        
        saveMessages();
        res.json({ 
            success: true, 
            message: `成功删除 ${initialCount - messages.length} 条留言`
        });
    } catch (err) {
        console.error('批量删除留言错误:', err);
        res.status(500).json({ error: '批量删除留言时出错' });
    }
});




// 获取文件列表
app.get('/files', (req, res) => {
    try {
        const files = fs.readdirSync(uploadDir).map(file => {
            const filePath = path.join(uploadDir, file);
            const stats = fs.statSync(filePath);
            return {
                name: file,
                path: `/download/${file}`,
                size: stats.size,
                mtime: stats.mtime
            };
        });
        
        // 按修改时间倒序排列
        files.sort((a, b) => b.mtime - a.mtime);
        res.json(files);
    } catch (err) {
        console.error('获取文件列表失败:', err);
        res.status(500).json({ error: '获取文件列表失败' });
    }
});

// 文件下载路由
app.get('/download/:filename', (req, res) => {
    const filePath = path.join(uploadDir, req.params.filename);
    if (fs.existsSync(filePath)) {
        res.download(filePath);
    } else {
        res.status(404).json({ error: '文件不存在' });
    }
});